dbt seedでRedshiftのsuper型にJSONを入れてみた
はじめに
データアナリティクス事業本部のおざわです。 今回はタイトルのとおり、dbt seedコマンドでRedshiftのsuper型のカラムを持つテーブルを作ってJSONデータを入れるというのを試してみました。
super型についてはこちらのブログをご参照ください。
Redshiftは以下ブログ記事にあるCloudFormationテンプレートでRedshift Serverlessを構築しています。
dbtのバージョンは以下のとおりです(dbt debugの結果を一部抜粋)
❯ dbt debug 06:57:06 Running with dbt=1.7.3 06:57:06 dbt version: 1.7.3 06:57:06 adapter type: redshift 06:57:06 adapter version: 1.7.0
1. 結論
結論からお伝えすると、カンマ区切りのCSVではエラーになったため、以下のような対応を行ってseedのテーブルを作ることができました。
- delimiterをカンマ(
,
)からパイプ(|
)に変更(パイプでなくてもOK) - CSVの区切り文字も変更
version: 2 seeds: - name: my_super_table_test config: delimiter: "|" column_types: id: int name: varchar(50) device: super
id|name|device 1|Alice|{"type":"phone","hoge":"yay"} 2|Bob|{"type":"tablet"} 3|Charlie|{"type":"laptop"}
2. 試したこと
最初に用意していたCSVです。
id, name, device 1, "Alice", "{\"type\":\"phone\",\"hoge\":\"yay\"}" 2, "Bob", "{\"type\":\"tablet\"}" 3, "Charlie", "{\"type\":\"laptop\"}"
2.1. column_typesの指定
CSVからseedのテーブルを作成する際、なにも指定しなければdbtがCSVの内容からデータ型を推測してテーブルを作成してくれます。公式ドキュメントには、データ型を指定する方法としてdbt_project.ymlを使う方法とproperties.ymlを使う方法が紹介されています。
今回は以下のようなYAMLファイルを作成しました。column_typesでdeviceカラムのデータ型にsuper型を指定しています。
version: 2 seeds: - name: my_super_table_test config: column_types: id: int name: varchar(50) device: super
この状態でdbt seed
を実行すると、カラム数が多すぎるという内容のエラーが出て失敗します。JSONの中にあるカンマをCSVの区切り文字として認識してしまっているようです。
{\"type\":\"phone\",\"hoge\":\"yay\"}
❯ dbt seed 01:44:26 Running with dbt=1.7.3 01:44:27 Registered adapter: redshift=1.7.0 01:44:27 Found 7 models, 1 seed, 7 sources, 0 exposures, 0 metrics, 696 macros, 0 groups, 0 semantic models 01:44:27 01:44:28 Concurrency: 1 threads (target='dev') 01:44:28 01:44:28 1 of 1 START seed file public.my_super_table_test .............................. [RUN] 01:44:28 1 of 1 ERROR loading seed file public.my_super_table_test ...................... [ERROR in 0.02s] 01:44:28 01:44:28 Finished running 1 seed in 0 hours 0 minutes and 1.12 seconds (1.12s). 01:44:28 01:44:28 Completed with 1 error and 0 warnings: 01:44:28 01:44:28 Compilation Error in seed my_super_table_test (seeds/my_super_table_test.csv) Row 0 has 4 values, but Table only has 3 columns
Githubに同じエラーに遭遇している人がいましたので、issueのコメントにあったように空白を削除してみたり、他にもエスケープできないか等を試したのですが、上記のエラーは解消できませんでした。
2.2. delimiterの指定
それなら区切り文字を変更できないかと調べたところ、dbtのバージョン1.7からは区切り文字を変更できましたので、以下のようにdelimiterを指定しました。
version: 2 seeds: - name: my_super_table_test config: delimiter: "|" column_types: id: int name: varchar(50) device: super
CSVファイル※の区切り文字も修正して、外側の二重引用符も削除しました。
※CSV = Character-Separated Valuesと考えればCSVファイルと呼んでいいはず
id|name|device 1|Alice|{"type":"phone","hoge":"yay"} 2|Bob|{"type":"tablet"} 3|Charlie|{"type":"laptop"}
成功しました
❯ dbt seed 03:38:25 Running with dbt=1.7.3 03:38:25 Registered adapter: redshift=1.7.0 03:38:25 Unable to do partial parsing because a project config has changed 03:38:26 Found 7 models, 1 seed, 7 sources, 0 exposures, 0 metrics, 696 macros, 0 groups, 0 semantic models 03:38:26 03:38:27 Concurrency: 1 threads (target='dev') 03:38:27 03:38:27 1 of 1 START seed file public.my_super_table_test .............................. [RUN] 03:38:29 1 of 1 OK loaded seed file public.my_super_table_test .......................... [INSERT 3 in 2.16s] 03:38:30 03:38:30 Finished running 1 seed in 0 hours 0 minutes and 3.39 seconds (3.39s). 03:38:30 03:38:30 Completed successfully 03:38:30 03:38:30 Done. PASS=1 WARN=0 ERROR=0 SKIP=0 TOTAL=1
成功すると以下のようにsuper型が設定されたテーブルができていました。
おわりに
以上、dbt seed
でRedshiftのsuper型のカラムを持つテーブルを作り、JSONデータを入れてみました。